package org.vaadin.vaadinjit.widgetset.client.ui;

import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.json.client.JSONBoolean;
import com.google.gwt.json.client.JSONNumber;
import com.google.gwt.json.client.JSONObject;
import com.google.gwt.json.client.JSONString;
import com.google.gwt.json.client.JSONValue;
import com.vaadin.terminal.gwt.client.ApplicationConnection;

public class JitConfiguration extends JSONObject {

	
	/**
	 * 
	 */
	public JitConfiguration() {
		super();
	}
	
	
	/**
	 * 
	 * @param optionName
	 * @param optionValue
	 */
	public void setOption(String optionName, String optionValue) {
		this.put(optionName, new JSONString(optionValue));
	}
	
	
	/**
	 * 
	 * @param optionName
	 * @param optionValue
	 */
	public void setOption(String optionName, Double optionValue) {
		this.put(optionName, new JSONNumber(optionValue));
	}
	
	
	/**
	 * 
	 * @param optionName
	 * @param optionValue
	 */
	public void setOption(String optionName, Integer optionValue) {
		this.put(optionName, new JSONNumber(optionValue));
	}
	
	
	/**
	 * 
	 * @param optionName
	 * @param optionValue
	 */
	public void setOption(String optionName, Boolean optionValue) {
		this.put(optionName, JSONBoolean.getInstance(optionValue));
	}
	
	
	/**
	 * 
	 * @param optionName
	 * @param optionValue
	 */
	public void setOption(String optionName, JitConfiguration subConfig) {
		this.put(optionName, subConfig);
	}
	

	/**
	 * 
	 * @param optionName
	 * @param optionValue
	 */
	public void setOption(String optionName, JSONValue optionValue) {
		this.put(optionName, optionValue);
	}
	
	
	public void setSubOption(String[] optionPath, String optionValue) {
		String optionName = optionPath[optionPath.length-1];
		prepareSubConfig(optionPath).put(optionName, new JSONString(optionValue));
	}
	
	
	public void setSubOption(String[] optionPath, Integer optionValue) {
		String optionName = optionPath[optionPath.length-1];
		prepareSubConfig(optionPath).put(optionName, new JSONNumber(optionValue));
	}
	
	
	public void setSubOption(String[] optionPath, Double optionValue) {
		String optionName = optionPath[optionPath.length-1];
		prepareSubConfig(optionPath).put(optionName, new JSONNumber(optionValue));
	}
	
	public void setSubOption(String[] optionPath, Boolean optionValue) {
		String optionName = optionPath[optionPath.length-1];
		prepareSubConfig(optionPath).put(optionName, JSONBoolean.getInstance(optionValue));
	}
	
	
	private JSONObject prepareSubConfig(String[] optionPath) {
		JSONObject obj = this;
		for (int i = 0; i < optionPath.length; i++) {
			String p = optionPath[i];
			
			if (i < optionPath.length-1) {
				JSONValue v = obj.get(p);
				if (v != null) {
					obj = v.isObject();
					
					if (obj == null) {
						// This happens if a "subconfig" is not actually a "subconfig"
						ApplicationConnection.getConsole().error(
								"A config object that should be object was not");
						return null;
					}	
				}
				else {
					// the subconfig does not exist yet
					obj.put(p, new JSONObject());
					obj = obj.get(p).isObject();
					
					if (obj == null)
						throw new RuntimeException("Unexpected error in JitConfiguration");
				}
			}
			else {
				return obj;
				// We are at the finally element in the path, so we add the element
				//obj.put(p, new JSONString(optionValue));
			}
		}
		return null;
	}
	

	
	
	/**
	 * 
	 * @return
	 */
	public JavaScriptObject getNativeConfig() {
		return this.getJavaScriptObject();
	}

}
